#include "../mqserver/mq_message.hpp"
#include <gtest/gtest.h>

mq::MessageManager::Ptr mmp;
class Message_Test : public testing::Environment
{
public:
    void SetUp() override
    {
        mmp = std::make_shared<mq::MessageManager>("./test-message/data");
    }
    void TearDown() override
    {
        // mmp->clear();
    }
private:
    ;
};

// // 新增消息测试:新增消息，然后观察可获取消息数量，以及持久化消息数量。
TEST(Message_Test,insert_test)
{
    // manager中的unordered_map是通过uuid作为映射的，所以我们应当注意使用不同的UUID作为映射。
    mq::BasicProperties properties;
    properties.set_id(mq::Helper::UuidHelper::uuid());
    properties.set_rounting_key("news.music.pop");
    properties.set_delivery_mode(mq::DeliveryMode::DURABLE);
    // 初始化队列机。
    mmp->initQueueMessage("queue1");
    // 插入
    mmp->insert("queue1",&properties,"Hello World-1",true);
    properties.set_id(mq::Helper::UuidHelper::uuid());
    mmp->insert("queue1",&properties,"Hello World-2",true);
    properties.set_id(mq::Helper::UuidHelper::uuid());
    mmp->insert("queue1",&properties,"Hello World-3",true);
    properties.set_id(mq::Helper::UuidHelper::uuid());
    mmp->insert("queue1",&properties,"Hello World-4",true);

    properties.set_id(mq::Helper::UuidHelper::uuid());

    mmp->insert("queue1",&properties,"Hello World-5",false);

    //std::cout << "getable_count" << mmp->getable_count("queue1") << std::endl;
    ASSERT_EQ(mmp->getable_count("queue1"),5);
    ASSERT_EQ(mmp->total_count("queue1"),4);
    ASSERT_EQ(mmp->durable_count("queue1"),4);
    ASSERT_EQ(mmp->waitack_count("queue1"),0);
}

// // 获取消息测试:获取一条消息，然后在不进行确认的情况下，查看可获取消息数量，待确认消息数量
// TEST(Message_Test,select_test)
// {
//     mq::MessagePtr msg1 = mmp->front("queue1");
//     ASSERT_NE(msg1.get(),nullptr);
//     ASSERT_EQ(msg1->payload().body(),std::string("Hello World-1"));
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
//     ASSERT_EQ(mmp->waitack_count("queue1"),1);

//     mq::MessagePtr msg2 = mmp->front("queue1");
//     ASSERT_NE(msg2.get(),nullptr);
//     ASSERT_EQ(msg2->payload().body(),std::string("Hello World-2"));
//     ASSERT_EQ(mmp->getable_count("queue1"),3);
//     ASSERT_EQ(mmp->waitack_count("queue1"),2);

//     mq::MessagePtr msg3 = mmp->front("queue1");
//     ASSERT_NE(msg3.get(),nullptr);
//     ASSERT_EQ(msg3->payload().body(),std::string("Hello World-3"));
//     ASSERT_EQ(mmp->getable_count("queue1"),2);
//     ASSERT_EQ(mmp->waitack_count("queue1"),3);

//     mq::MessagePtr msg4 = mmp->front("queue1");
//     ASSERT_NE(msg4.get(),nullptr);
//     ASSERT_EQ(msg4->payload().body(),std::string("Hello World-4"));
//     ASSERT_EQ(mmp->getable_count("queue1"),1);
//     ASSERT_EQ(mmp->waitack_count("queue1"),4);

//     mq::MessagePtr msg5 = mmp->front("queue1");
//     ASSERT_NE(msg5.get(),nullptr);
//     ASSERT_EQ(msg5->payload().body(),std::string("Hello World-5"));
//     ASSERT_EQ(mmp->getable_count("queue1"),0);
//     ASSERT_EQ(mmp->waitack_count("queue1"),5);

//     mq::MessagePtr msg6 = mmp->front("queue1");
//     ASSERT_EQ(msg6.get(),nullptr);
// }

// // 恢复历史数据
// TEST(Message_Test,recovery_test)
// {
//     mmp->initQueueMessage("queue1");
//     ASSERT_EQ(mmp->getable_count("queue1"),4);
// }

mq::MessageManager::Ptr mmp1;
class Message_Test1 : public testing::Environment
{
public:
    void SetUp() override
    {
        mmp1 = std::make_shared<mq::MessageManager>("./test-message/data");
    }
    void TearDown() override
    {
        // mmp->clear();
    }
private:
    ;
};

// 删除消息测试:确认一条消息，查看持久化消息的数量，待确认消息数量。
TEST(Message_Test,remove_test)
{
    mmp1->initQueueMessage("queue1");
    ASSERT_NE(mmp1->durable_count("queue1"),0);
    mmp1->destroyQueueMessage("queue1");
    ASSERT_EQ(mmp1->durable_count("queue1"),0);
}

int main(int argc,char* argv[])
{
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new Message_Test);
    testing::AddGlobalTestEnvironment(new Message_Test1);
    RUN_ALL_TESTS();

    return 0;
}